<!--
To change this template, choose Tools | Templates
and open the template in the editor.
-->
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Keerukamad if tingimuslaused</title>
    </head>
    <body>
        <?php
            //Siinkohal tulebki mängu esimeses tunnis mainitud matemaatiline loogika
            //loogikaalgebra, ning kohati ka lausearvutus.
            //Tähtis loogikaalgebra. 
            /*
             * Loogiline korrutamine, ehk JA-tehe, ehk konjunktsioon.
             * PHP-s tähistab seda operaator && 
             * Mujal esineb ka tähiseid &, ˄, AND, and
             * x1 | x2 | Tõeväärtus && puhul (x1 && x2)
             * -----------------------------
             *  0 |  0 |     0
             * -----------------------------
             *  0 |  1 |     0
             * -----------------------------
             *  1 |  0 |     0
             * -----------------------------
             *  1 |  1 |     1
             * 
             * Ehk mingi väärtus on vaid siis tõene, kui NII üks väärtus KUI KA
             * teine väärtus (kui ka kolmas, kui ka neljas jne) on samaaegselt tõesed.
             */
            $a = 6;
            $b = 4;
            $c = 3;
            $d = 15;
            
            //Ehk kui on tõene, et NII a on suurem b-st KUI KA c on väiksem d-st
            //on ka tingimus tõene. Järgnevas näiteski on tingimus tõene (Loogikaalgebra
            //alusel x1=1 (sest a on ju suurem, kui b), x2=1 (sest c on ju väiksem, kui d),
            //seega x1 & x2 = 1 & 1 = 1 ehk tõene tingimus. 
            //PHP süntaksile kohaselt sama näide
            // x1=1, x2=1, seega x1 && x2 = 1 && 1 = 1 ehk tõene).
            if (($a > $b) && ($c < $d))
            {
                echo '$a on suurem, kui $b';
                echo '<br/>';
                echo '$c on väiksem, kui $d';
                echo '<br/>';
            }
            else
            {
                echo 'Tingimus ei ole täidetud!';
                echo '<br/>';
            }
            
            /* Loogiline liitmine, ehk VÕI-tehe, ehk disjunktsioon
             * PHP-s tähistab seda operaator || 
             * Mujal esineb ka tähiseid +, V, OR, or
             * x1 | x2 | Tõeväärtus || puhul (x1 || x2)
             * -----------------------------
             *  0 |  0 |     0
             * -----------------------------
             *  0 |  1 |     1
             * -----------------------------
             *  1 |  0 |     1
             * -----------------------------
             *  1 |  1 |     1
             * 
             * Ehk mingi väide on tõene siis, kui väitest on tõene KAS üks VÕI 
             * teine (VÕI kolmas, VÕI neljas jne) osa. S.t. vähemalt üks tingi-
             * mustest peab olema täidetud. Järgneval juhul esimene tingimus 
             * täidetud pole, teine tingimus aga on. Seega täidetakse
             * if blokis olev lause, kuna loogiline liitmine nõuab ainult ühe 
             * tingimuse tõeseks olemist.
             * (Loogikaalgebra alusel antud juhul x1=0 (ehk mittetõene, kuna a
             * ei ole ju väiksem, kui b), x2=1 (kuna c on ju väiksem, kui d),
             * sellest lähtuvalt tehe  x1 V x2 = 0 V 1 = 1
             * php märgistusega omaselt x1=0, x2=1, x1 || x2 = 0 || 1 = 1 ehk tõene)
            */
            if (($a < $b) || ($c < $d))
            {
                echo '$a on suurem, kui $b';
                echo '<br/>';
                echo '$c on väiksem, kui $d';
                echo '<br/>';
            }
            else
            {
                echo 'Tingimus ei ole täidetud!';
                echo '<br/>';
            }
            
            /* Loogiline eitus, ehk inversioon.
             * PHP-s tähistab seda operaator ! 
             * Mujal esineb ka tähiseid ˉ, ', NOT, not. 
             * 
             * Eituse puhul saab eitada (ehk vastupidiseks pöörata) nii loogilist
             * korrutamist (JA tehet, ehk konjunktsiooni) või loogilist liitmist
             * (VÕI tehet, ehk disjunktsiooni). Vaatleme kõigepealt loogilise 
             * korrutamise eitamist php süntaksiga
             * x1 | x2 | Tõeväärtus !(x1 && x2) puhul
             * -----------------------------
             *  0 |  0 |     1
             * -----------------------------
             *  0 |  1 |     1
             * -----------------------------
             *  1 |  0 |     1
             * -----------------------------
             *  1 |  1 |     0
             * 
             * Loogilise liitmise eitamine php süntaksiga
             * x1 | x2 | Tõeväärtus !(x1 || x2) puhul
             * -----------------------------
             *  0 |  0 |     1
             * -----------------------------
             *  0 |  1 |     0
             * -----------------------------
             *  1 |  0 |     0
             * -----------------------------
             *  1 |  1 |     0
             * 
             * NB! Eituse eitamisel saame esialgse tulemuse.
             * 
             * Vaatleme esmalt loogilise korrutamise eitamise näidet. Antud juhul
             * võtsime kasutusele esialgse näite, mille puhul if lause üldtingimus sai täidetud.
             * Seda selle pärast, et NII a oli suurem b-st KUI KA c oli väiksem d-st.
             * x1=1 (sest a on suurem, kui b), x2=1 (tõene, sest c on väiksem, kui d),
             * seega x1 && x2 = 1 && 1 = 1 ehk tõene. ! märk eitab 
             * seda kõike, ehk tulemus tuleb vastupidine, ehk 0, ehk väär ehk false.
             * Brauseris kuvatakse seega else lause blokk, mis viitab, et 
             * tingimus ei ole täidetud. 
            */
            if (!(($a > $b) && ($c < $d)))
            {
                echo '$a on suurem, kui $b';
                echo '<br/>';
                echo '$c on väiksem, kui $d';
                echo '<br/>';
            }
            else
            {
                echo 'Loogilise korrutamise tingimus EI OLE täidetud!';
                echo '<br/>';
            }
            
            /*
             * Loogilise liitmise eitamise näide. 
             * Antud juhul võtsime kasutusele esialgse näite, mille puhul esimene tingimus
             * polnud täidetud, teine aga oli. Loogiline liitmine aga nõudiski 
             * vaid ühe tingimuse tõepärasust. 
             * Kuna KAS a oli väiksem b-st (mis antud juhul väär x1=0) VÕI c oli väiksem d-st
             * (mis antud juhul tõene x2=1), siis php süntaksi kohaselt:
             * x1=0, x2=1, x1 || x2 = 0 || 1 = 1.  ! märk eitab aga kõike, ehk  
             * tulemus tuleb vastupidine, ehk 0, ehk väär ehk false.
             * Brauseris kuvatakse seega else lause blokk, mis viitab, et 
             * tingimus ei ole täidetud. 
            */
            if (!(($a < $b) || ($c < $d)))
            {
                echo '$a on suurem, kui $b';
                echo '<br/>';
                echo '$c on väiksem, kui $d';
                echo '<br/>';
            }
            else
            {
                echo 'Loogilise liitmise tingimus EI OLE täidetud!';
                echo '<br/>';
            }
            
            /*
             * Siinkohal saab tuua ka näiteid lausearvutusest. Oletame, et if 
             * lause tingimus A on fakt, mille kohaselt Schumacher võidab sõidu.
             * 
             * Lisaks eksisteerivad järgmised tingimused
             * I - ilm on ideaalne
             * R - rehvid on korras
             * V - vormel ei lähe rikki
             * S - Schumacher ei sõida seina
             * T - turvaauto ei riku eelisseisu
             * U - unenägudes võidab Schumacher alati sõidu
             * 
             * Lepime kokku, et Schumacher võidab sõidu vaid siis, kui korraga
             * on täidetud järgmise lause tingimused: Schumacher võidab sõidu 
             * siis ja ainult siis, KUI NII tingimus I, KUI KA tingimus R, KUI KA
             * tingimus V, KUI KA tingimus S, KUI KA tingimus T VÕI tingimus U on täidetud.
             * 
             * Lause konstruktsioon NII, KUI KA viitab juba ära, et esimene pool 
             * lausest on loogiline korrutamine (s.t. kõik tingimused peavad korraga 
             * tõesed olema). Lause teine pool VÕI lause viitab loogilisele liitmisele, 
             * ehk korraga peab tõene olema vähemalt üks tingimus. Antud juhul
             * peabki tõene olema KAS kõik VÕI lausele eelnenud tingimused või VÕI 
             * lausele järgnenud tingimus. Ainult nii saab Schumacher sõidu võita.
             * S.t. ainult nii väärtustub meie if lause tingimus tõeseks.
             * Tingimuses näeb selline arutuluskäik välja nii (Tähele tuleb panna
             * et stringi boolean väärtus on alati algselt tõene, kui stringi
             * väärtus booleaniks teisendada (tüübiteisendus, ehk cast)):
             */
            $A = 'Scumacher võitis sõidu'; //vaikimisi tõene
            $I = (bool) 'Ilm on ideaalne'; //vaikimisi tõene
            $R = (bool) 'Rehvid on korras'; //vaikimisi tõene
            $V = (bool) 'Vormel ei lähe rikki'; //vaikimisi tõene
            $S = (bool) 'Schumacher ei sõida seina'; //vaikimisi tõene
            $T = (bool) 'Turvaauto ei riku eelisseisu'; //vaikimisi tõene
            $U = (bool) 'Unenägudes võidab Schumacher alati sõidu'; //vaikimisi tõene
            

            if (($I && $R && $V && $S && $T) || $U)
            {
                echo $A;
                echo '<br/>';
            }
            
            //Väärtusi sai ühest tüübist teiseks muuta veel ka alljärgneval viisil.
            //Sellest tulemus küll ei muutu, kuid edasine andmetüüp on muutujatel kindlasti
            //boolean. Nii võib tingimuslause loogilisem tunduda (tehteid saab vaadata, kui 0 ja 1
            //mida me loomulikult ilmselt ka enne ette kujutasime)
            settype($I, 'boolean');
            settype($R, 'boolean');
            settype($V, 'boolean');
            settype($S, 'boolean');
            settype($T, 'boolean');
            settype($U, 'boolean');
            /*
             * Loogikaalgebra kohaselt (1&1&1&1&1) V 1 = 1 ehk tõene
             */
            if (($I && $R && $V && $S && $T) || $U)
            {
                echo $A;
                echo '<br/>';
            }
            
            /*
             * Kui aga kasvõi üks tingimus loogilise korrutamise blokist ei osutu
             * tõeseks (näiteks $V eitus (ehk !$V) on, et vormel läks rikki), siis muutub
             * kogu loogilise korrutamise blokk vääraks (tingimused pole kõik ju 
             * üheaegselt täidetud). Küll aga saame tulemuseks, et Schumacher võidab
             * sõidu, kuna me ei välistanud võimalust, et ta näeb und.
             * (Loogikaalgebra kohaselt PHP süntaksit kasutades
             * I=1, R=1, V=0 (eeldasime, et vormel läks rikki), S=1, T=1, U=1. 
             * Loogilise korrutamise blokk väärtustub vääraks:
             * 1 && 1 && 0 && 1 && 1 = 0.    Viies loogilise korrutise bloki, kui ka
             * loogilise liitmise bloki (U=1) kokku, saame  0 || 1 = 1, ehk kogutulem on tõene)
             * PANNA TÄHELE HÜÜUMÄRGI OPERAATORIT, ehk eitust $V ees!!!
             */
            if (($I && $R && !$V && $S && $T) || $U)
            {
                echo $A . ', kuna ta nägi ilmselt und!';
                echo '<br/>';
            }
            
            /*
             * Kui samaaegselt, kui vormel läks rikki, ei näinud Schumacher und
             * on rikutud ka loogilise liitmise tingimus.
             * (Loogikaalgebra kohaselt PHP süntaksit kasutades
             * I=1, R=1, V=0, S=1, T=1, U=0 (sest schumacher ei näinud und). 
             * Loogilise korrutamise blokk:
             * 1 && 1 && 0 && 1 && 1 = 0.    Viies loogilise korrutise bloki, kui ka
             * loogilise liitmise bloki (U=0) kokku, saame  0 || 0 = 0, ehk kogutulem on väär)
             */
            if (($I && $R && !$V && $S && $T) || !$U)
            {
                echo $A;
                echo '<br/>';
            }
            else 
            {
                echo 'Schumacheril läks vormel rikki ja ta ei võitnud sõitu';
            }
            
        ?>
    </body>
</html>
